home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / lib / signal / signal.c < prev   
C/C++ Source or Header  |  1997-09-09  |  3KB  |  134 lines

  1. /*
  2.  *  SIGNAL.C
  3.  *
  4.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  5.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  6.  *    DICE-LICENSE.TXT.
  7.  */
  8.  
  9. #include <exec/types.h>
  10. #include <libraries/dos.h>
  11. #include <clib/exec_protos.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <signal.h>
  15. #include <errno.h>
  16.  
  17. static void SigIgn(int);
  18. static void SigBye(int);
  19.  
  20. extern void (*_SigIntFunc)(int);    /*  see amiga/chkabort.c    */
  21.  
  22. /*
  23.  *  Note: SIGINT is special
  24.  */
  25.  
  26. static void (*Sigs[NSIG])(int) = {
  27.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  28.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  29.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn,
  30.     SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn, SigIgn
  31. };
  32.  
  33. static char SigType[NSIG] = { 0,0,0,0,0,0,0,0, /* An array of SIG_DFL trust me */
  34.                               0,0,0,0,0,0,0,0,
  35.                               0,0,0,0,0,0,0,0,
  36.                               0,0,0,0,0,0,0,0};
  37.  
  38. long _SigMask;
  39. long _SigRdy;
  40.  
  41. __sigfunc
  42. signal(signo, func)
  43. int signo;
  44. __sigfunc func;
  45. {
  46.     __sigfunc old;
  47.  
  48.     if (signo < 0 || signo > 31 || func == SIG_ERR) {
  49.     errno = EINVAL;
  50.     return(SIG_ERR);
  51.     }
  52.     switch(SigType[signo]) {
  53.     case SIG_DFL:
  54.     old = SIG_DFL;
  55.     break;
  56.     case SIG_IGN:
  57.     old = SIG_IGN;
  58.     break;
  59.     default:
  60.     old = (__sigfunc)Sigs[signo];
  61.     break;
  62.     }
  63.  
  64.     switch(func) {
  65.     case SIG_DFL:
  66.     SigType[signo] = (char)SIG_DFL;
  67.     if (signo == SIGINT) {
  68.         _SigIntFunc = NULL;
  69.         Sigs[signo] = SigBye;
  70.     } else {
  71.         Sigs[signo] = SigIgn;
  72.     }
  73.     if (_SigRdy & (1 << signo))
  74.         raise(signo);
  75.     break;
  76.     case SIG_IGN:
  77.     SigType[signo] = (char)SIG_IGN;
  78.     if (signo == SIGINT)
  79.         _SigIntFunc = SigIgn;
  80.     Sigs[signo] = SigIgn;
  81.     _SigRdy &= ~(1 << signo);
  82.     break;
  83.     default:
  84.     SigType[signo] = 99;
  85.     if (signo == SIGINT)
  86.         _SigIntFunc = func;
  87.     Sigs[signo] = func;
  88.     if (_SigRdy & (1 << signo))
  89.         raise(signo);
  90.     break;
  91.     }
  92.     return(old);
  93. }
  94.  
  95. int
  96. raise(signo)
  97. int signo;
  98. {
  99.     __sigfunc func;
  100.  
  101.     if (_SigMask & (1 << signo)) {
  102.     _SigRdy |= 1 << signo;
  103.     return(0);
  104.     }
  105.     _SigRdy &= ~(1 << signo);
  106.  
  107.     if (signo == SIGINT) {
  108.     SetSignal(SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_C);  /*  cause break signal */
  109.     chkabort();
  110.     return(0);
  111.     }
  112.  
  113.     if (signo < 0 || signo > 31) {
  114.     errno = EINVAL;
  115.     return(-1);
  116.     }
  117.     func = Sigs[signo];
  118.     signal(signo, SIG_DFL);
  119.  
  120.     (*func)(signo);
  121.     return(0);
  122. }
  123.  
  124. static void
  125. SigIgn(signo)
  126. {
  127. }
  128.  
  129. static void
  130. SigBye(signo)
  131. {
  132.     exit(EXIT_FAILURE);
  133. }
  134.